home *** CD-ROM | disk | FTP | other *** search
- *crt0.asm
- * Copyright (C) 1990 Paul Gittings.
- *
- * This file is part of aMIGA gARGANTUAN c cOMPILER (agcc).
- *
- * agcc is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 1, or (at your option)
- * any later version.
- *
- * agcc is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with agcc; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- * A startup/__main routine for use with agcc and CCLib.library
- * ctr0.o should be used if floating point is required.
- * ctr0_no_fp.o should be used when an application does not use
- * floating point.
- * The following libraries are loaded:
- * Dos.library
- * CCLib.library
- * MathIeeeDoubBas.library
- *
- * This routine is based on:
- * Robert Albrecht's _main.c and
- * Bryce Nesbitt's BothStartup.asm
- *
- * Paul Gittings 21/2/1990
- * ACSnet paulg@tplrd.tpl.oz
- * snail 172 Union St.
- * Erskineville 2043
- * NSW
- * Australia
- *
- ******* Included Files *************************************************
-
- ; NOLIST
- ; INCLUDE "exec/types.i"
-
-
- ; IFND EXEC_ABLES_I
- ; INCLUDE "exec/ables.i"
- ; ENDC
-
- FORBID MACRO
- IFC '\1',''
- ADDQ.B #1,TDNestCnt(A6)
- ENDC
- IFNC '\1',''
- MOVE.L 4,\1
- ADDQ.B #1,TDNestCnt(\1)
- ENDC
- ENDM
-
- ; IFND EXEC_EXECBASE_I
- ; INCLUDE "exec/execbase.i"
- ; ENDC
-
- ThisTask EQU $114
- TDNestCnt EQU $127
-
- ; IFND LIBRARIES_DOS_I
- ; INCLUDE "libraries/dos.i"
- ; ENDC
-
- ; IFND LIBRARIES_DOESEXTENS_I
- ; INCLUDE "libraries/dosextens.i"
- ; ENDC
-
- pr_CLI EQU $0ac
- pr_MsgPort EQU $05c
-
- ;
- ; Offsets into user data
- ;
- ud_argc EQU 96
- ud_argv EQU 100
-
- ******* Imported *******************************************************
-
- xref _main ; C code entry point
-
- ; cclib routines.
-
- xref _ClearSTDIO
- xref _SetupSTDIO
- xref _GetSTDIO
-
- callsys macro
- xref _LVO\1
- jsr _LVO\1(a6)
- endm
-
- ******* Exported *******************************************************
-
- xdef _SysBase
- xdef _DOSBase
- xdef _MathIeeeDoubBasBase
- xdef _CCLibBase
-
- xdef _errno
- xdef _stdin
- xdef _stdout
- xdef _stderr
- xdef __math
- xdef _blocksize
- xdef _exit_fcn
- xdef _type
-
- xdef _exit ; standard C exit function
- xdef __exit
-
- ************************************************************************
- *
- * Standard Program Entry Point
- *
- * If called from CLI then a0 will point to a buffer containing the
- * command line but not including the command name. Also, d0 will
- * contain the length of this line.
- *
- *
- ;
- ;a3 - frame pointer
- ;a4 - ThisTask
- dosCmdLen equr d6
- dosCmdBuf equr d5
- ;
- startup: move.l d0,dosCmdLen
- move.l a0,dosCmdBuf
- lea.l ss,a3 ; set up "frame pointer"
- clr.l (a3)+ ; _errno
- clr.l (a3)+ ; _exit_fcn
- move.l sp,(a3)+ ; _initialSP
-
- ;------ get Exec's library base pointer:
- move.l 4,a6 ; get _AbsExecBase
- move.l a6,(a3)+ ; _SysBase
-
- ;------ Open the DOS library:
-
- clr.l d0
- lea.l DOSName(pc),A1
- callsys OpenLibrary
- tst.l d0
- beq bailout
- move.l d0,(a3)+ ; _DOSBase
-
- ;------ Open Math Ieee Double library:
-
- clr.l d0
- lea.l MathIeeeName(pc),a1
- callsys OpenLibrary
- tst.l d0
- beq bailout
- move.l d0,(a3)+ ; _MathIeeeDoubBasBase
-
- ;------ Open CCLib library:
-
- clr.l d0
- lea.l CCLibName(pc),a1
- callsys OpenLibrary
- tst.l d0
- beq bailout
- move.l d0,(a3)+ ; _CCLibBase
-
- ;------ get the address of our task
- move.l ThisTask(a6),a4
-
- ;------ were we started from the Workbench
- tst.l pr_CLI(A4)
- beq.s fromWorkbench
-
- ;------ No, then we were started by CLI.
- ;------ so clear out workbench msg pointer
- clr.l (a3)+ ; returnMsg
- bra.s skipwbstartup
-
- ;
- ;------- Do some Workbench specific startup work
- ;
-
- ;------ we are now set up. wait for a message from our starter
- fromWorkbench: ;[a4=ThisTask]
- nostartupmsg:
- lea.l pr_MsgPort(A4),a0 ; our process base
- callsys WaitPort
- ;------ Get the message and save in returnMsg
- lea.l pr_MsgPort(A4),a0 ; our process base
- callsys GetMsg
- tst.l d0
- beq.s nostartupmsg ; ROM kernal manual says we could
- ; get a signal but no msg...
-
- move.l d0,(a3)+ ; returnMsg
-
- skipwbstartup:
- clr.l (a3)+ ; _stdin
- clr.l (a3)+ ; _stdout
- clr.l (a3)+ ; _stderr
- clr.l (a3)+ ; _type
- clr.l (a3) ; _blocksize
- lea.l ss,a3
- ;
- ; SetupSTDIO(&stdin, &stdout, &stderr, &errno, &blocksize, &type,
- ; MathIeeeDoubBasBase, dosCmdLen, dosCmdBuf, returnMsg,
- ; _exit)
- ;
-
- pea __exit
- move.l returnMsg-ss(a3),-(sp)
- move.l dosCmdBuf,-(SP)
- move.l dosCmdLen,-(SP)
- move.l _MathIeeeDoubBasBase-ss(a3),-(sp)
- pea _type-ss(a3)
- pea _blocksize-ss(a3)
- pea _errno-ss(a3)
- pea _stderr-ss(a3)
- pea _stdout-ss(a3)
- pea _stdin-ss(a3)
- jsr _SetupSTDIO
-
- add.w #44,sp
- tst.l d0
- beq.s bailout
-
- ;------ get pointer to the block of user data (ud) belonging to
- ;------ this task.
-
- jsr _GetSTDIO ; put ud into d0
- tst.l d0
- beq.s bailout
-
- ;------ push argv and argc from the ud onto the stack
- ;------ and call main()
- move.l d0,a1
- move.l ud_argv(a1),-(sp) ; put ud->_argv onto stack
- clr.l d0
- move.w ud_argc(a1),d0 ; get ud->_argc and
- move.l d0,-(sp) ; push to stack
-
- jsr _main ; hand over to C main routine.
-
- clr.l _errno ; Successful return code
- bra.s exit2
-
- ;------ get here if something went wrong during startup.
- bailout:
- move.l #$DEADBEEF,_errno
- bra.s exit2
-
- ************************************************************************
- *
- * C Program exit(returncode) Function
- *
- *
- ; a1 - general
- ; a3 - Frame pointer
- ; a6 - Exec Base pointer
- _exit:
- __exit:
- move.l 4(SP),_errno ; save error code
- exit2: lea.l ss,a3 ; set "frame pointer" back up
-
- ;------ check for an exit function set up by call to atexit().
- ;------ If there is one execute it.
-
- move.l _exit_fcn-ss(a3),a1
- cmp.l #0,a1
- beq.s no_atexit_fcn
- jsr (a1)
-
- no_atexit_fcn:
- move.l _initialSP-ss(a3),SP ; restore stack pointer
-
- move.l 4,a6
-
- ;------ If MathIeeeDoubBas.library is open close it
- move.l _MathIeeeDoubBasBase-ss(a3),a1
- cmp.l #0,a1
- beq.s no_MIDB
- callsys CloseLibrary
- no_MIDB:
- ;------ If CCLib.library is open close it
- move.l _CCLibBase-ss(a3),a2
- cmp.l #0,a2
- beq.s no_CCLib
- ;------ close all files free memory
- jsr _ClearSTDIO
- move.l a2,a1
- callsys CloseLibrary
-
- no_CCLib:
- ;------ If DOS library is open close it
- move.l _DOSBase-ss(a3),a1
- cmp.l #0,a1
- beq.s exitToDOS
- callsys CloseLibrary
-
- exitToDOS:
- move.l _errno-ss(a3),d0 ; save return code
- rts
- ******* DATA ***********************************************************
-
- DOSName: dc.b 'dos.library',0
- EVEN
- MathIeeeName: dc.b 'mathieeedoubbas.library',0
- EVEN
- CCLibName: dc.b 'CClib.library',0
- EVEN
- __math dc.w 1 ; Set to indicate MathIEEEDoubBas is loaded.
- EVEN
- BSS b.crt0
- ss ; placemarker
- _errno ds.l 1 ; error number from OS routines
- _exit_fcn ds.l 1 ; exit function ptr. setup by call to atexit
- _initialSP ds.l 1 ; initial stack pointer
- _SysBase ds.l 1 ; exec library base pointer
- _DOSBase ds.l 1 ; dos library base pointer
- _MathIeeeDoubBasBase ds.l 1 ; Math Ieee Double library base pointer
- _CCLibBase ds.l 1 ; CCLib library base pointer
- returnMsg ds.l 1 ; Workbench message, or zero for CLI startup
- _stdin ds.l 1 ; STANDARD
- _stdout ds.l 1 ; I/O FILE
- _stderr ds.l 1 ; POINTERS
- _type ds.l 1
- _blocksize ds.l 1 ; blocksize global variable
-
- END
-